package net.blank.timerUtl
{
	import flash.events.TimerEvent;
	import flash.utils.Timer;
	
	import net.blank.commonInterface.IDestructible;
	import net.blank.commonInterface.IRecyclable;
	import net.blank.functionUtl.ExecFunctions;
	
	/**
	 * 公用计时器
	 * @author blank
	 */
	public class PublicTimer implements IRecyclable,IDestructible
	{
		/**
		 * 函数回调列表
		 */
		private var $execFunc:ExecFunctions;
		
		/**
		 * 计时器
		 */
		private var $timer:Timer;
		
		/**
		 * 已被摧毁
		 */
		private var _destroyed:Boolean;
		
		/**开始计时器*/
		private function start():void{
			if($timer.running){
				return;
			}else{
				$timer.addEventListener(TimerEvent.TIMER,onTimer);
				$timer.start();
			}
		}
		
		/**
		 * 停止计时器
		 * @return Boolean 是否成功结束。
		 */
		private function stop():void{
			if(!$execFunc.numFunc){
				$timer.removeEventListener(TimerEvent.TIMER,onTimer);
				$timer.stop();
			}
		}
		
		/**timer的timer事件。*/
		private function onTimer(evt:TimerEvent):void{
			if($execFunc.exec()){
				evt.updateAfterEvent();
			}
			stop();
		}
		
		/**
		 * 添加回调函数
		 */
		public function addFunc(func:Function, args:Array=null):Boolean{
			if($execFunc.addFunc(func,args)){
				start();
				return true;
			}
			return false;
		}
		
		/**
		 * 移除回调函数
		 * @param func
		 * 
		 */
		public function removeFunc(func:Function):void{
			$execFunc.removeFunc(func);
		}
		
		public function reset():void{
			$timer.removeEventListener(TimerEvent.TIMER,onTimer);
			$timer.stop();
			$execFunc.reset();
		}
		
		public function destroy():void{
			$timer.removeEventListener(TimerEvent.TIMER,onTimer);
			$timer.stop();
			$execFunc.destroy();
		}
		
		/**
		 * 公用计时器
		 * @param delay 间隔的时间(毫秒ms)
		 * 
		 */
		public function PublicTimer(delay:int=25){
			super();
			
			$execFunc=new ExecFunctions();
			$timer=new Timer(delay);
		}
		
		/**
		 * timer的延迟时间（即调用的时间间隔）
		 * <p>默认为25毫秒（AS的ENTER_FRAME和Timer的值都不是十分精确的，</p>
		 * <p>如果要保证精确度，应使用getTimer()函数，Timer的delay值小时25毫秒时，精确度将大幅下降）。</p>
		 * <p>此属性应在此对象第一次创建时设置好，以后则不要轻意更改。</p>
		 * <p>要实现不同的时间延迟，可以用如下方式：</p>
		 * <listing version=3.0>
		 * private i:int=0;
		 * private timer:PublicTimer=new PublicTimer(25);
		 * private lastTime:Number=0;
		 * 
		 * private function init():void{
		 * 	lastTime=getTimer();
		 * 	timer.addExecFunc(execFunc);
		 * }
		 * 
		 * private function execFunc():void{
		 * 	trace("真正的间隔时间为：",getTimer()-lastTime);
		 * 	if(i%2==0){
		 * 		trace(i);
		 * 	}
		 * 	if(i>=100){
		 * 		timer.romoveExecFunc(execFunc);
		 * 	}
		 * }
		 * </listing>
		 */
		public function set delay(value:int):void{
			$timer.delay=value;
		}
		public function get delay():int{
			return $timer.delay;
		}
		
		/**
		 * 函数列表中函数的数目
		 */
		public function get numFunc():uint{
			return $execFunc.numFunc;
		}
		
		public function get destroyed():Boolean{
			return _destroyed;
		}
	}
}